Cloudflare で発信元ポート番号を取得する (Header Modification)
ブログ記事で書き直した。 気が向いたらこっちにも反映する 経緯
IPv4 アドレスが共有されている環境でよろしくないことをされた時のために、クライアント (発信者) の IP アドレスだけでなく発信元ポート番号も記録したほうがよいらしい
RFC 6302 では、ログに送信元ポート番号を含めることを推奨
平成 27 年に、プロバイダ責任制限法第 4 条第 1 項 「発信者情報を定める省令」 の一部が改正され、開示の対象となる発信者情報にポート番号が追加
やり方
Set dynamic (動的にセット) にして、被らなさそうなヘッダ名を決めて値を cf.edge.client_port とする。
そのヘッダに発信元ポート番号が入るので、 Apache などのログ対象に加える。
方法は サーバーソフトウェア名 x-forwarded-for ログ などでググったら出る。
発信元ポート番号以外にも色々取得できる。
関数で使うのは文字結合の concat と concat に数値を渡すための to_string くらいかな
実際にやってみた
Free プランだと Transform Rules を 2 つしか作れないので、とりあえずリクエスト全部に適用できるような条件にして、使えそうなフィールドを全部載せてみる。
https://i.imgur.com/ndeOm58.png
条件は適当
code:設定
Mod-ASN: ip.geoip.asnum
Mod-Client-Port: cf.edge.client_port
Mod-Client-Trust-Score: cf.client_trust_score
Mod-Geo: concat("continent=", ip.geoip.continent, "; country=", ip.geoip.country)
Mod-Http-Version: http.request.version
Mod-Is-Good-Bot: cf.client.bot
Mod-Original-Host: http.host
Mod-Recieved-Timestamp: http.request.timestamp.sec
Mod-Recieved-Timestamp-Msec: http.request.timestamp.msec
Mod-Threat-Score: cf.threat_score
code:2021/10/1 時点で実際にサーバで取得できた情報。 ブラウザが送信したヘッダを除く。 xxxxは伏せ字
CDN-Loop: cloudflare
CF-Connecting-IP: xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
CF-IPCountry: JP
CF-Ray: 69764d4bfd040a72-KIX
CF-Visitor: {"scheme":"http"}
Mod-ASN: xxxx
Mod-Client-Port: 58846
Mod-Client-Trust-Score: 90
Mod-Geo: continent=AS; country=JP
Mod-Http-Version: HTTP/3
Mod-Is-Good-Bot: false
Mod-Original-Host: xxxx.heguro.com
Mod-Recieved-Timestamp-Msec: 556
Mod-Recieved-Timestamp: 1633097714
Mod-Threat-Score: 0
X-Forwarded-For: xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
X-Forwarded-Proto: http
そのほか
Cloudflare Workers の機能だけではできないっぽい
Header Modification をした上でなんやかんやすることは出来る (ヘッダが書き換えられてから Workers にリクエストが飛ぶため)